/*
 * Copyright 2014 Щекотова Ангелина Александровна.
 * Этот файл — часть J4JClientServer Framework
 * J4JClientServer Framework - свободная программа: вы можете перераспространять ее и/или изменять
 * ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде, в каком
 * она была опубликована Фондом свободного программного обеспечения; либо
 * версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
 *
 * J4JClientServer Framework распространяется в надежде, что она будет полезной,
 * но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
 * или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
 * общественной лицензии GNU.
 *
 * Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
 * вместе с этой программой. Если это не так, см.
 * <http://www.gnu.org/licenses/>.
 */

package ru.java4java.ClientServerFramework.interfaces;

/**
 * Используйте этот слушатель для обработки исключений.
 * @see ru.java4java.ClientServerFramework.SocketHandler#options() SocketHandler#options()
 * @see ru.java4java.ClientServerFramework.SocketHandlerOptions#setExceptionListener(ExceptionListener) SocketHandlerOptions#setExceptionListener(ExceptionListener)
 * @see ru.java4java.ClientServerFramework.Server#setClientOptionsClass(Class) Server#setClientOptionsClass(Class)
 * @see ru.java4java.ClientServerFramework.Server#setDefaultSocketHandlerOptions(ru.java4java.ClientServerFramework.SocketHandlerOptions) Server#setDefaultSocketHandlerOptions(SocketHandlerOptions)
 */
public interface ExceptionListener {

    /**<pre>
     * Тип соотносится с исключениями следующих видов:
     * {@link Type#EOF_EXCEPTION}            - {@link java.io.EOFException},
     * {@link Type#SOCKET_TIMEOUT_EXCEPTION} - {@link java.net.SocketTimeoutException},
     * {@link Type#SOCKET_EXCEPTION}         - {@link java.net.SocketException},
     * {@link Type#IO_EXCEPTION}             - {@link java.io.IOException}
     * </pre>
     */
    public static enum Type {
        EOF_EXCEPTION,
        SOCKET_TIMEOUT_EXCEPTION,
        SOCKET_EXCEPTION,
        IO_EXCEPTION
    }

    /**<pre>
     * Будет вызываться всякий раз как при приеме или отправке пакета будет возникать исключение.
     * </pre>
     * @param type {@link ExceptionListener.Type}
     * @param exception
     * {@link java.io.EOFException},
     * {@link java.net.SocketTimeoutException},
     * {@link java.net.SocketException},
     * {@link java.io.IOException}
     * @return
     */
    public boolean exception(Type type, Exception exception);

}
